跳到主要内容

React-受控组件和非受控组件

问题:react组件的input元素,不设置value也会正常显示,这是为什么?

React 组件中的 input 元素即使不显式设置 value 属性,也能正常显示用户输入的内容,这是因为 input元素默认行为的特性。在 React 中,input元素有两种工作模式:受控组件和非受控组件。

  1. 受控组件:在受控组件中,input的 value 属性被 React 的状态(state)控制。你需要通过 onChange 事件来更新状态,从而反映在 input的 value 中。这种方式下,input的值始终由 React 状态决定。

  2. 非受控组件:如果不设置 input的 value 属性,或者不通过 onChange 事件更新它,input就会以非受控组件的方式工作。在非受控组件中,React 不会控制输入的状态,input元素会根据用户的输入自然地更新其显示的内容。这是因为浏览器默认的 HTML input行为允许用户输入,而不需要任何 JavaScript 代码来更新输入字段的值。

在你提供的代码片段中,input元素的 value 属性没有被显式设置,因此它将以非受控组件的方式工作,自动显示用户的输入。这种方式简化了代码,特别是在表单数据不需要立即由 React 状态管理时。然而,对于需要验证、格式化或即时反馈用户输入的场景,使用受控组件会更合适。


问题:受控与否关键在于value值的来源吗?

是的,受控组件与非受控组件的关键区别在于数据(如输入框的值)的来源和管理方式。对于React组件:

  • 受控组件:其值由React的状态管理,通常通过statesetState来更新。这意味着组件的值(例如,输入框的value属性)是由React组件的状态控制的。每当需要改变值时,都会通过事件处理函数来更新React的状态,从而更新UI。

  • 非受控组件:其值由DOM本身管理。在非受控组件中,React并不直接控制输入框的值;相反,它允许DOM直接处理数据输入和存储,通常通过使用ref来从DOM节点中获取当前的值。

在提供的代码片段中,没有直接的信息表明RcInput组件是作为受控组件还是非受控组件使用的,因为是否受控主要取决于value属性是否被传递并由外部状态控制。如果RcInput接收一个value属性,并且这个属性值是通过父组件的状态来管理的,那么它就是一个受控组件。如果没有value属性或者value不是由React状态控制的,那么它可能是一个非受控组件。


总结: 判断组件是受控组件,还是非受控组件,主要取决于input的value的值的来源,若显示的设置了value的值,则input为受控组件;若没有设置value值,则为非受控组件